package cn.smxy.ln.service.impl;

import cn.hutool.core.date.DateTime;
import cn.smxy.ln.service.OssService;
import cn.smxy.ln.util.ConstantPropertiesUtils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

/**
 * @author ln
 * @date 2022年09月18日 19:23
 */
@Service
public class OssServiceImpl implements OssService {
    @Override
    @Async
    public ListenableFuture<String> uploadFileAvatar(MultipartFile file) {
        //System.out.println("线程名字为：" + Thread.currentThread().getName());
        // Endpoint以北京为例，其它Region请按实际情况填写。
        String endpoint = ConstantPropertiesUtils.END_POINT;
        // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录RAM控制台创建RAM账号。
        String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
        String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
        String url = "";
        // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
        try {
            //创建OSS实例
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            //获取上传文件输入流
            InputStream inputStream = file.getInputStream();
            // 上传文件到指定的存储空间（bucketName）并将其保存为指定的文件名称（objectName）。
            String fileName = file.getOriginalFilename();

            String uuid = UUID.randomUUID().toString().replaceAll("-","");
            fileName = uuid+fileName;

            //文件按照日期进行分类
            String datePath = new DateTime().toString("yyyy/MM/dd");
            fileName = datePath+"/"+fileName;

            ossClient.putObject(bucketName, fileName,inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();
            //https://doctor-mo.oss-cn-beijing.aliyuncs.com/42677e182bc90362b623564223072a7.jpg
            url = "https://"+bucketName+"."+endpoint+"/"+fileName;
            //System.out.println("url:" + url);
            return new AsyncResult<>(url);
        } catch (IOException e) {
            e.printStackTrace();
            return new AsyncResult<>(url);
        }
        // 创建OSSClient实例。
    }

}
